﻿/**	@file		id2name.h
 *	@date		(2009-02-19 23:42:55)/(2011-09-12 00:44:43)
 *-----------------------------------------------------------------------------
 *	@version	1.0.4.7
 *	@author		Nick Shallery	(nicknide@gmail.com)
 *	@copyright	YOU HAVE ALL LEFT WITH THIS CODE WHILE YOU KEEP COMMENT IN EVERY COPY.
 *-----------------------------------------------------------------------------
**/

#if			!defined(__LXUT__RSRC__ID2NAME__NICK__K_IN_G__)
#define		__LXUT__RSRC__ID2NAME__NICK__K_IN_G__
//==============================================================================
//--------------------------------------------------------------------------

#if			!defined(__LOLIX__LOLIX_TYPE__K_IN_G__)
	#include	"../../lolix/lolix_type.h"
#endif	//	!defined(__LOLIX__LOLIX_TYPE__K_IN_G__)

#if			!defined(__LOLIX__TOY__KEY_BIND__K_IN_G__)
	#include	"../../lolix/toy/key_bind.hpp"
#endif	//	!defined(__LOLIX__TOY__KEY_BIND__K_IN_G__)

namespace lolix{namespace loli{
	class file_stream;
}}
namespace lxut{namespace rsrc{class	id2name;}}
class LOLIX_NO_VTABLE lxut::rsrc::id2name
	: public lolix::itf
{
public:
	LOLIX_DEFINE_FACTORY((0x6713ef71, 0xff3746b3, 0xa1333422, 0x0e14c438), (lxut::rsrc::id2name**, lolix::loli::file_flow* ff, bool is_writeable, lolix::dynamic_allocator* alc /* = 0 */));
	LOLIX_DECLARE_ITF(lxut::rsrc::id2name, lolix::itf, (0x65b3b2c1, 0x4a4149e2, 0xb1452e3d, 0x3ca63de0));
	typedef	lolix::lx_u64	id_type;
#if			LOLIX_CFG__SUPPORT_CPP_0X
	enum : id_type {bad_id	= ~0ull};
#else	//	LOLIX_CFG__SUPPORT_CPP_0X
	const static id_type bad_id	= ~0ull;
#endif	//	LOLIX_CFG__SUPPORT_CPP_0X
	class enum_callback;

	//===========================================================================
	//	清除当前数据
	//===========================================================================
	LOLIX_INTERFACE(clear		, lolix::LOLIX_RETNV	, (void));

	//===========================================================================
	//	设置一个名字
	//---------------------------------------------------------------------------
	//	name			[i ]	: 名字字符串
	//	name_len		[i ]	: 字符串长度(必须为真实的字符串长度,
	//								如果在这个长度之前字符串以 0 结尾依旧有效
	//	lost_at_existed	[i ]	: 是否已经存在指定的 id 则返回失败
	//	id				[io]	: 指定的一个名字 ID(如果指针的内容为合法ID)
	//								自动分配一个名字ID(如果指针的内容为非法ID : bad_id)
	//---------------------------------------------------------------------------
	//	LOLIX_ERROR_RES_ALREADY_EXIST	: 当 lost_at_existed 被指定 : id 已经被占用
	//	LOLIX_ERROR_LESS_RESOURCE		: 无法分配新的空间
	//---------------------------------------------------------------------------
	//	如果存在则修改, 如果不存在则插入
	//===========================================================================
	LOLIX_INTERFACE(set_name	, lolix::LOLIX_RETNV	, (const wchar_t* name
		, size_type name_len, bool lost_at_existed, id_type* id));

	//===========================================================================
	//	得到名字
	//---------------------------------------------------------------------------
	//	name			[ o]	: 名字所在缓冲区
	//	name_len		[io]	: i)缓冲区长度; o)字符串实际长度
	//---------------------------------------------------------------------------
	//	LOLIX_ERROR_SEARCH_RES_LOST		: 通过 id 查找名字失败
	//---------------------------------------------------------------------------
	//	返回的字符串不以 0 结尾 (就算缓冲区长度绰绰有余的时候也是如此)
	//===========================================================================
	LOLIX_INTERFACE(get_name	, lolix::LOLIX_RETNV	, (wchar_t name[]
		, size_type* name_len, id_type id)const);

	//===========================================================================
	//	枚举指定 ID 段内的 ID
	//---------------------------------------------------------------------------
	//	cb				[i ]	: 用来枚举的一个回调对象
	//---------------------------------------------------------------------------
	//===========================================================================
	LOLIX_INTERFACE(enum_dat	, lolix::LOLIX_RETNV	, (enum_callback* cb)const);

	//===========================================================================
	//	删除某个指定的　ID
	//---------------------------------------------------------------------------
	//	id				[i ]	: 需要被删除的对象ID
	//---------------------------------------------------------------------------
	//	失败表示删除失败
	//===========================================================================
	LOLIX_INTERFACE(erase		, lolix::LOLIX_RETNV	, (id_type id));

	//===========================================================================
	//	写入文件中
	//---------------------------------------------------------------------------
	//	dst				[i ]	: 写入到的源文件
	//---------------------------------------------------------------------------
	//===========================================================================
	LOLIX_INTERFACE(write_file	, lolix::LOLIX_RETNV	, (lolix::loli::file_flow* dst)const);
};


class LOLIX_NO_VTABLE lxut::rsrc::id2name::enum_callback
	: public lolix::itf
{
public:
	LOLIX_DECLARE_ITF(lxut::rsrc::id2name, lolix::itf, (0x2ab71207, 0xd2714fd8, 0x88ab86ac, 0x33a16e10));
	LOLIX_INTERFACE(invoke		, bool	, (lxut::rsrc::id2name::id_type, const wchar_t* name, size_type name_len));
};


//--------------------------------------------------------------------------
//==============================================================================
#endif	//	!defined(__LXUT__RSRC__ID2NAME__NICK__K_IN_G__)
